package es.wtestgen.action.profesor;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionRedirect;

import es.wtestgen.action.WTestGenAction;
import es.wtestgen.bean.profesor.PreguntaForm;
import es.wtestgen.bean.profesor.RespuestaForm;
import es.wtestgen.domain.Asignatura;
import es.wtestgen.domain.Pregunta;
import es.wtestgen.domain.Profesor;
import es.wtestgen.domain.Respuesta;
import es.wtestgen.services.AsignaturaDAO;
import es.wtestgen.services.PreguntaDAO;
import es.wtestgen.services.RespuestaDAO;

public class MantenimientoRespuestasAction extends WTestGenAction {

	private static final Log log = LogFactory.getLog(MantenimientoRespuestasAction.class);

	@Override
	public ActionForward _execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)  {

		log.info("_________Estamos en MantenimientoRespuestasAction donde se gestionan todos los tramites para las respuestas de las preguntas de las asignaturas");	

		String accion = request.getParameter("accion");
		ActionForward forward = null;
		
		if(accion == null || accion.equals("")){
			forward = seleccionarAsignaturaRespuestas(mapping, form, request, response);
		}else if (accion.equals("listar")){
			forward = listar(mapping, form, request, response);
		}else if(accion.equals("nuevo")){
			forward = nuevo(mapping, form, request, response);
		}else if(accion.equals("eliminar")){
			forward = eliminar(mapping, form, request, response);
		}else if(accion.equals("editar")){
			forward = editar(mapping, form, request, response);
		}else if(accion.equals("guardar")){
			forward = guardar(mapping, form, request, response);
		}else if(accion.equals("cargarPreguntasAsignatura")){
			forward = cargarPreguntasAsignatura(mapping, form, request, response);			
		}else if(accion.equals("paso1")){
			forward = paso1(mapping, form, request, response);
		}else if(accion.equals("paso2")){
		forward = paso2(mapping, form, request, response);
		}else if(accion.equals("buscar")){
			forward = buscar(mapping,form,request,response);
		}else if(accion.equals("buscarRespuesta")){
			forward = buscarRespuesta(mapping,form,request,response);
		}else if(accion.equals("listarRespuestasAsignatura")){
			forward = listarRespuestasAsignatura(mapping,form,request,response);			
		}

		return forward;
	}
	
	
	
	private ActionForward listarRespuestasAsignatura(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		RespuestaForm respuestaForm = (RespuestaForm)form;
		
		RespuestaDAO respuestaDao = new RespuestaDAO();
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		Asignatura asignatura = new Asignatura();
		
		if(respuestaForm.getCodAsig() <= 0){
			String codAsig = (String)request.getParameter("codAsig");
			
			if(codAsig != null){
				respuestaForm.setCodAsig(new Integer(codAsig).intValue());				
			}else{
				asignatura = (Asignatura)request.getSession().getAttribute("asignatura");
				respuestaForm.setCodAsig(asignatura.getCodAsig());				
			}
			
		}
		
		asignatura = (Asignatura)asignaturaDao.findById(String.valueOf(respuestaForm.getCodAsig())).get(0);
		
		List<Respuesta> listaRespuestas = respuestaDao.findRespuestasAsignatura(asignatura);
		
		if(listaRespuestas != null && listaRespuestas.size()>0){
			respuestaForm.setRespuestas(listaRespuestas);
		}else{
			respuestaForm.setRespuestas(new ArrayList<Respuesta>());
		}
		
		request.getSession().setAttribute("respuestas", listaRespuestas);
		request.getSession().setAttribute("asignatura", asignatura);
		return mapping.findForward("listarRespuestas");		
	}



	private ActionForward seleccionarAsignaturaRespuestas(
			ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
		RespuestaForm respuestaForm = (RespuestaForm)form;
		
		RespuestaDAO respuestaDao = new RespuestaDAO();		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		List<Respuesta> listaRespuestas = respuestaDao.findAll();
		
		if(listaRespuestas != null && listaRespuestas.size()>0){
			respuestaForm.setRespuestas(listaRespuestas);
		}else{
			respuestaForm.setRespuestas(new ArrayList<Respuesta>());
		}		
		
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		List<Asignatura> asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		if(asignaturas != null && asignaturas.size()>0){
			respuestaForm.setAsignaturas(asignaturas);
		}else{
			respuestaForm.setAsignaturas(new ArrayList<Asignatura>());
		}
		request.setAttribute("asignaturas", respuestaForm.getAsignaturas());
		return mapping.findForward("seleccionarAsignaturaRespuestas");
	}



	private ActionForward buscarRespuesta(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		RespuestaForm respuestaForm = (RespuestaForm)form;
		
		RespuestaDAO respuestaDao = new RespuestaDAO();
		
		List<Respuesta> respuestas = respuestaDao.findByParameters(respuestaForm);
		
		if(respuestas != null && respuestas.size()>0){
			respuestaForm.setRespuestas(respuestas);
		}else{
			respuestaForm.setRespuestas(new ArrayList<Respuesta>());
		}
		request.setAttribute("respuestas", respuestaForm.getRespuestas());
		
		return mapping.findForward("buscarRespuesta");		
	}


	private ActionForward buscar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		RespuestaForm respuestaForm = (RespuestaForm) form;
		
		return mapping.findForward("buscarRespuesta");
	}
	
	
	
	private ActionForward paso1(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		RespuestaForm respuestaForm = (RespuestaForm) form;
				
		/*
		 *	para el "volver" del asistente cuando se edita una respuesta ya creada  
		 */
		String codPreg = (String)request.getParameter("codPreg");
		if(codPreg != null && !"".equals(codPreg)){
			respuestaForm.setCodPreg(Integer.parseInt(codPreg));
		}
		
		
		/*
		 * Tratamiento para la vuelta atras al editar una respuesta del paso2 al paso1 para no perder los campos
		 * del texto de la respuesta y el logico esCorrecta
		 */		
		String codResp = (String)request.getSession().getAttribute("codResp");
		if(codResp != null && !"".equals(codResp)){
			RespuestaDAO respuestaDao = new RespuestaDAO();
			List<Respuesta> respuestas = respuestaDao.findById(codResp);
			Respuesta respuesta = respuestas.get(0);
			
			if(respuestaForm.getRespuestaResp() == null || "".equals(respuestaForm.getRespuestaResp())){
				respuestaForm.setRespuestaResp(respuesta.getRespuestaResp());
				respuestaForm.setEsCorrecta(respuesta.isEsCorrecta());
			}
		}
				
		
		List<Asignatura> asignaturas = new ArrayList<Asignatura>();
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		request.setAttribute("asignaturas", asignaturas);
		String codAsig = String.valueOf(respuestaForm.getCodAsig());
		
		if(codAsig == null || "".equals(codAsig)){
			 codAsig = (String)request.getParameter("codAsig"); 
		}
		Asignatura asignatura = (Asignatura)asignaturaDao.findById(codAsig).get(0);	
		
		PreguntaDAO preguntaDao = new PreguntaDAO();
		List<Pregunta> preguntas = preguntaDao.findPreguntasAsignatura(asignatura);
		
		request.setAttribute("respuesta", respuestaForm);
		if(preguntas != null && preguntas.size() > 0){
			request.setAttribute("preguntas", preguntas);
		}else{
			request.setAttribute("preguntas", new ArrayList<Pregunta>());			
		}
		request.setAttribute("asignatura", asignatura);
		return mapping.findForward("nuevoRespuesta_paso1");
	}
	
	
	private ActionForward paso2(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */		
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		RespuestaForm respuestaForm = (RespuestaForm) form;
				
		List<Asignatura> asignaturas = new ArrayList<Asignatura>();
		
		Asignatura asignatura = new Asignatura();
		Pregunta pregunta = new Pregunta();
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		PreguntaDAO preguntaDao = new PreguntaDAO();
		
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);		
		
		asignatura = (Asignatura)asignaturaDao.findById(String.valueOf(respuestaForm.getCodAsig())).get(0);	
		
		pregunta = (Pregunta)preguntaDao.findById(String.valueOf(respuestaForm.getCodPreg())).get(0);
				
		request.setAttribute("asignaturas", asignaturas);
		request.setAttribute("respuestaForm", respuestaForm);
		
		request.getSession().setAttribute("pregunta", pregunta);
		request.getSession().setAttribute("asignatura", asignatura);
		
		return mapping.findForward("nuevoRespuesta_paso2");
	}


	private ActionForward cargarPreguntasAsignatura(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		RespuestaForm respuestaForm = (RespuestaForm) form;
		
		PreguntaDAO preguntaDao = new PreguntaDAO();		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		Asignatura asignatura = new Asignatura();
		
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
		
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		asignatura = (Asignatura)asignaturaDao.findById(String.valueOf(respuestaForm.getCodAsig())).get(0);
		
		List<Pregunta> preguntas =  preguntaDao.findPreguntasAsignatura(asignatura);
		if(preguntas != null && preguntas.size()>0){
			respuestaForm.setPreguntas(preguntas);
		}else{
			respuestaForm.setPreguntas(new ArrayList<Pregunta>());
		}
		
		request.setAttribute("respuesta", respuestaForm);
		request.setAttribute("asignaturas", asignaturas);
		request.setAttribute("preguntas", respuestaForm.getPreguntas());
		
		return mapping.findForward("nuevoRespuesta");
	}
	
	
	public ActionForward nuevo(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			 {
		
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		RespuestaForm respuestaForm = (RespuestaForm) form;
				
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		List<Asignatura> asignaturas = new ArrayList<Asignatura>();
				
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		request.getSession().setAttribute("asignaturas", asignaturas);
		request.setAttribute("respuesta", respuestaForm);
		
		return mapping.findForward("nuevoRespuesta");
	}
	
	

	public ActionForward eliminar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{
		RespuestaForm respuestaForm = (RespuestaForm) form;
		
		RespuestaDAO respuestaDao = new RespuestaDAO();
		
		String codResp = request.getParameter("codResp");
		
		/*
		 * Con esta clase que hereda de ActionForward le podemos anadir parametros a las
		 * redirecciones forward 
		 */
		ActionRedirect actionRedirect = null;
		
		if(respuestaDao.eliminar(Integer.parseInt(codResp))){
			ActionForward findForward = mapping.findForward("eliminadoRespuesta");
			actionRedirect = new ActionRedirect(findForward);
			//actionRedirect.addParameter("accion", "");
			
			Asignatura asignatura = (Asignatura)request.getSession().getAttribute("asignatura");
			if(asignatura != null && asignatura.getCodAsig() > 0){
				actionRedirect.addParameter("accion", "listarRespuestasAsignatura");				
			}else{
				actionRedirect.addParameter("accion", "listar");
			}
			
			actionRedirect.addParameter("eliminadoOk", "si");
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}
	}
	
	public ActionForward editar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{	
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		RespuestaForm respuestaForm = (RespuestaForm) form;		
		
		RespuestaDAO respuestaDao = new RespuestaDAO();
		PreguntaDAO preguntaDao = new PreguntaDAO();
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		Respuesta respuesta = new Respuesta();
		Pregunta pregunta = new Pregunta();
		
		String codResp = request.getParameter("codResp");
		
		List<Respuesta> respuestas = respuestaDao.findById(codResp);		
		respuesta = respuestas.get(0);
		
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		
		pregunta = (Pregunta)preguntaDao.findById(String.valueOf(respuesta.getPregunta().getCodPreg())).get(0);
		
		respuestaForm.setCodAsig(pregunta.getAsignatura().getCodAsig());
		respuestaForm.setCodResp(String.valueOf(respuesta.getCodResp()));
		respuestaForm.setRespuestaResp(respuesta.getRespuestaResp());
		respuestaForm.setEsCorrecta(respuesta.isEsCorrecta());
		
		if(respuesta.getPregunta().getCodPreg() <= 0){
			respuestaForm.setCodPreg(Integer.parseInt((String)request.getParameter("codPreg")));			
		}else{
			respuestaForm.setCodPreg(respuesta.getPregunta().getCodPreg());			
		}
		
		List<Pregunta> preguntas =  preguntaDao.findPreguntasAsignatura(pregunta.getAsignatura());
		if(preguntas != null && preguntas.size()>0){
			respuestaForm.setPreguntas(preguntas);
		}else{
			respuestaForm.setPreguntas(new ArrayList<Pregunta>());
		}
		
		
		/*
		 * Metemos en sesion la respuesta de la que se trata para poder recuperarla en el proceso del asistente
		 */
		if(codResp != null && !"".equals(codResp)){
			request.getSession().setAttribute("codResp", codResp);			
		}
		
		request.setAttribute("preguntas", preguntas);
		request.setAttribute("asignaturas", asignaturas);		
		request.setAttribute("respuesta", respuestaForm);
		
		return mapping.findForward("nuevoRespuesta");
	}
	
	public ActionForward guardar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{
		RespuestaForm respuestaForm = (RespuestaForm) form;
		
		RespuestaDAO respuestaDao = new RespuestaDAO();
		PreguntaDAO preguntaDao = new PreguntaDAO();
		
		Respuesta respuesta = new Respuesta();
		Pregunta pregunta = new Pregunta();
		
		respuesta.setRespuestaResp(respuestaForm.getRespuestaResp());
		respuesta.setEsCorrecta(respuestaForm.isEsCorrecta());
		
		if(respuestaForm.getCodResp() != null && !respuestaForm.getCodResp().equals("") && !respuestaForm.getCodResp().equals("0")){
			int id = Integer.parseInt(respuestaForm.getCodResp());
			respuesta.setCodResp(id);
		}else{
			respuesta.setCodResp(-1);
		}
		
		ActionRedirect actionRedirect = null;
		
		if(respuestaForm.getCodPreg() > 0){
			pregunta = (Pregunta)preguntaDao.findById(String.valueOf(respuestaForm.getCodPreg())).get(0);
		}
		List<Respuesta> respuestas = new ArrayList<Respuesta>();
		if(pregunta != null){
			respuestas = (List<Respuesta>)respuestaDao.findRespuestasPregunta(pregunta);
		}
		
		/*
		 * Se comprobará si existe alguna correcta ya entre las respuestas de la pregunta
		 * y si la nueva a insertar también es correcta se produce un error por duplicidad de correctas
		 */
		if(respuestaForm.isEsCorrecta()){
			for (Iterator iterator = respuestas.iterator(); iterator.hasNext();) {
				Respuesta resp = (Respuesta) iterator.next();
				if(resp.isEsCorrecta()){
					return mapping.findForward("errorDosRespuestasCorrecta");
				}
			}
		}
		
		if(respuestaDao.guardarRespuestaEnPregunta(respuesta,respuestaForm.getCodPreg())){			
			ActionForward findForward = mapping.findForward("guardadoRespuesta");
			actionRedirect = new ActionRedirect(findForward);
			
			Asignatura asignatura = (Asignatura)request.getSession().getAttribute("asignatura");
			if(asignatura != null && asignatura.getCodAsig() > 0){
				actionRedirect.addParameter("accion", "listarRespuestasAsignatura");				
			}else{
				actionRedirect.addParameter("accion", "listar");
			}
			
			actionRedirect.addParameter("guardadoOk", "si");
			
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}
		
	}

	public ActionForward listar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response){
		
		RespuestaForm respuestaForm = (RespuestaForm)form;
		
		RespuestaDAO respuestaDao = new RespuestaDAO();		
		
		List<Respuesta>listaRespuestas = respuestaDao.findAll();		
		
		if(listaRespuestas != null && listaRespuestas.size()>0){
			respuestaForm.setRespuestas(listaRespuestas);
		}else{
			respuestaForm.setRespuestas(new ArrayList<Respuesta>());
		}
		
		request.getSession().removeAttribute("asignatura");
		
		request.setAttribute("respuestas", respuestaForm.getRespuestas());		
		
		return mapping.findForward("listarTodasRespuestas");
	}
	

}
